package coneccion;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.naming.NamingException;

import mapeo.UsuariosMapper;

import objetos.Rol;
import objetos.Usuario;

import utils.Constantes;
import utils.UtilidadesConexion;

public class UsuariosConsultas {
	
	public UsuariosConsultas() {
		super();
	}

	/**
	 * 
	 * @param usuario
	 * @param primerResultado
	 * @param cantidadResultados
	 * @return
	 */
	public List<Usuario> getUsuariosList(Usuario usuarioBusqueda, Integer primerResultado, Integer cantidadResultados){
		
		List<Usuario> resultList = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT u.usuarios_nombre_usuario as usuarios_nombre_usuario, ")
				.append("u.usuarios_nombres as usuarios_nombres, ")
				.append("u.usuarios_apellidos as usuarios_apellidos, ")
				.append("td.tipos_documentos_id as tipos_documentos_id, ")
				.append("td.tipos_documentos_nombre as tipos_documentos_nombre, ")
				.append("td.tipos_documentos_nombre_completo as tipos_documentos_nombre_completo, ")
				.append("u.usuarios_numero_documento as usuarios_numero_documento, ")
				.append("u.usuarios_contrasenia as usuarios_contrasenia ");
			
			query.append("FROM usuarios u, tipos_documentos td ");
			if(usuarioBusqueda!=null && usuarioBusqueda.getRoles() != null && usuarioBusqueda.getRoles().size()>0){
				query.append(", usuarios_roles ur ");
			}
			query.append("WHERE  u.usuarios_tipo_documento=td.tipos_documentos_id ");
			if(usuarioBusqueda!=null && usuarioBusqueda.getRoles() != null && usuarioBusqueda.getRoles().size()>0){
				query.append("AND ur.usuarios_nombre_usuario=u.usuarios_nombre_usuario ");
			}
			if(usuarioBusqueda != null){
				
				if(usuarioBusqueda.getNombreUsuario() != null && usuarioBusqueda.getNombreUsuario().length()>0){
					query.append("AND u.usuarios_nombre_usuario LIKE '" + usuarioBusqueda.getNombreUsuario() + "%' ");
				}
				
				if(usuarioBusqueda.getApellidos() != null && usuarioBusqueda.getApellidos().length()>0){
					query.append("AND u.usuarios_apellidos LIKE '" + usuarioBusqueda.getApellidos() + "%' ");
					
				}
				
				if(usuarioBusqueda.getDocumentoIdentidad() != null ){
					if(usuarioBusqueda.getDocumentoIdentidad().getId() != null && usuarioBusqueda.getDocumentoIdentidad().getId().intValue()>0){
						query.append("AND u.usuarios_tipo_documento=" + usuarioBusqueda.getDocumentoIdentidad().getId() + " ");
					}					
				}
				
				if(usuarioBusqueda.getNumeroDocumento() != null && usuarioBusqueda.getNumeroDocumento().length()>0){
					query.append("AND u.usuarios_numero_documento='" + usuarioBusqueda.getNumeroDocumento() + "' ");
				}
				
				if(usuarioBusqueda.getRoles() != null && usuarioBusqueda.getRoles().size()>0){
					query.append("AND ( ");
					boolean primerRol = false;
					for (Rol rol:usuarioBusqueda.getRoles()){
						if(primerRol){
							query.append("OR ");
						}
						query.append("ur.roles_nombre='").append(rol.getNombre()).append("' ");
						primerRol = true;
					}
					query.append(" ) ");
				}
			}
			
			query.append("ORDER BY u.usuarios_apellidos ASC, u.usuarios_nombre_usuario ASC, u.usuarios_tipo_documento ASC, u.usuarios_numero_documento ASC ");
			
			if(primerResultado != null && cantidadResultados!=null){
				if(primerResultado.intValue()==0 && cantidadResultados.intValue()>0){
					query.append("LIMIT ").append(cantidadResultados).append(" ");
				}else if(primerResultado.intValue()>0 && cantidadResultados.intValue()>0){
					query.append("LIMIT ").append(primerResultado).append(", ").append(cantidadResultados).append(" ");
				}
			}
			
			
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			
			UsuariosMapper usuariosMapper = new UsuariosMapper();
			resultList = usuariosMapper.parseListaUsuario(rs);
			
		} catch (NamingException e) {
			e.printStackTrace();
			resultList = new ArrayList<Usuario>();
		} catch (SQLException e) {
			e.printStackTrace();
			resultList = new ArrayList<Usuario>();
		} catch (Exception e) {
			e.printStackTrace();
			resultList = new ArrayList<Usuario>();
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		RolesConsultas rolesConsultas = new RolesConsultas();
		for(Usuario u:resultList){ 
			u.setRoles(rolesConsultas.getRolesPorUsuario(u));
		}
		
		return resultList;
		
	}
	
	
public Integer getCantidadUsuarios(Usuario usuarioBusqueda){
		
		Integer result = Integer.valueOf(0); 
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");		
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT count(*) as cantidad ");
			
			query.append("FROM usuarios u, tipos_documentos td ");
			if(usuarioBusqueda!=null && usuarioBusqueda.getRoles() != null && usuarioBusqueda.getRoles().size()>0){
				query.append(", usuarios_roles ur ");
			}
			query.append("WHERE  u.usuarios_tipo_documento=td.tipos_documentos_id ");
			if(usuarioBusqueda!=null && usuarioBusqueda.getRoles() != null && usuarioBusqueda.getRoles().size()>0){
				query.append("AND ur.usuarios_nombre_usuario=u.usuarios_nombre_usuario ");
			}
			if(usuarioBusqueda != null){
				
				if(usuarioBusqueda.getNombreUsuario() != null && usuarioBusqueda.getNombreUsuario().length()>0){
					query.append("AND u.usuarios_nombre_usuario LIKE '" + usuarioBusqueda.getNombreUsuario() + "%' ");
				}
				
				if(usuarioBusqueda.getApellidos() != null && usuarioBusqueda.getApellidos().length()>0){
					query.append("AND u.usuarios_apellidos LIKE '" + usuarioBusqueda.getApellidos() + "%' ");
					
				}
				
				if(usuarioBusqueda.getDocumentoIdentidad() != null ){
					if(usuarioBusqueda.getDocumentoIdentidad().getId() != null && usuarioBusqueda.getDocumentoIdentidad().getId().intValue()>0){
						query.append("AND u.usuarios_tipo_documento=" + usuarioBusqueda.getDocumentoIdentidad().getId() + " ");
					}					
				}
				
				if(usuarioBusqueda.getNumeroDocumento() != null && usuarioBusqueda.getNumeroDocumento().length()>0){
					query.append("AND u.usuarios_numero_documento='" + usuarioBusqueda.getNumeroDocumento() + "' ");
				}
				
				if(usuarioBusqueda.getRoles() != null && usuarioBusqueda.getRoles().size()>0){
					query.append("AND ( ");
					boolean primerRol = false;
					for (Rol rol:usuarioBusqueda.getRoles()){
						if(primerRol){
							query.append("OR ");
						}
						query.append("ur.roles_nombre='").append(rol.getNombre()).append("' ");
						primerRol = true;
					}
					query.append(" ) ");
				}
			}
			
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			if(rs.next()){
				result = rs.getInt("cantidad") ;
			}
		} catch (NamingException e) {
			e.printStackTrace();
			result = Integer.valueOf(0); 
		} catch (SQLException e) {
			e.printStackTrace();
			result = Integer.valueOf(0);
		} catch (Exception e) {
			e.printStackTrace();
			result = Integer.valueOf(0);
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return result;
		
	}


	public Usuario getUsuario(Usuario usuarioBusqueda){
		Usuario result = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT u.usuarios_nombre_usuario as usuarios_nombre_usuario, ")
				.append("u.usuarios_nombres as usuarios_nombres, ")
				.append("u.usuarios_apellidos as usuarios_apellidos, ")
				.append("td.tipos_documentos_id as tipos_documentos_id, ")
				.append("td.tipos_documentos_nombre as tipos_documentos_nombre, ")
				.append("td.tipos_documentos_nombre_completo as tipos_documentos_nombre_completo, ")
				.append("u.usuarios_numero_documento as usuarios_numero_documento, ")
				.append("u.usuarios_contrasenia as usuarios_contrasenia ");
			
			query.append("FROM usuarios u, tipos_documentos td ");
			if(usuarioBusqueda!=null && usuarioBusqueda.getRoles() != null && usuarioBusqueda.getRoles().size()>0){
				query.append(", usuarios_roles ur ");
			}
			query.append("WHERE  u.usuarios_tipo_documento=td.tipos_documentos_id ");
			if(usuarioBusqueda!=null && usuarioBusqueda.getRoles() != null && usuarioBusqueda.getRoles().size()>0){
				query.append("AND ur.usuarios_nombre_usuario=u.usuarios_nombre_usuario ");
			}
			if(usuarioBusqueda != null){
				
				if(usuarioBusqueda.getNombreUsuario() != null && usuarioBusqueda.getNombreUsuario().length()>0){
					query.append("AND u.usuarios_nombre_usuario='" + usuarioBusqueda.getNombreUsuario() + "' ");
				}
				
				if(usuarioBusqueda.getApellidos() != null && usuarioBusqueda.getApellidos().length()>0){
					query.append("AND u.usuarios_apellidos LIKE '" + usuarioBusqueda.getApellidos() + "%' ");
					
				}
				
				if(usuarioBusqueda.getDocumentoIdentidad() != null ){
					if(usuarioBusqueda.getDocumentoIdentidad().getId() != null && usuarioBusqueda.getDocumentoIdentidad().getId().intValue()>0){
						query.append("AND u.usuarios_tipo_documento=" + usuarioBusqueda.getDocumentoIdentidad().getId() + " ");
					}					
				}
				
				if(usuarioBusqueda.getRoles() != null && usuarioBusqueda.getRoles().size()>0){
					query.append("AND ( ");
					boolean primerRol = false;
					for (Rol rol:usuarioBusqueda.getRoles()){
						if(primerRol){
							query.append("OR ");
						}
						query.append("ur.roles_nombre='").append(rol.getNombre()).append("' ");
						primerRol = true;
					}
					query.append(" ) ");
				}
				
				if(usuarioBusqueda.getNumeroDocumento() != null && usuarioBusqueda.getNumeroDocumento().length()>0){
					query.append("AND u.usuarios_numero_documento='" + usuarioBusqueda.getNumeroDocumento() + "' ");
				}
			}
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			
			UsuariosMapper usuariosMapper = new UsuariosMapper();
			result = usuariosMapper.parseUsuario(rs);
			
		} catch (NamingException e) {
			e.printStackTrace();
			result = new Usuario();
		} catch (SQLException e) {
			e.printStackTrace();
			result = new Usuario();
		} catch (Exception e) {
			e.printStackTrace();
			result = new Usuario();
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		RolesConsultas rolesConsultas = new RolesConsultas();
		if(result.getNombreUsuario()!=null){
			result.setRoles(rolesConsultas.getRolesPorUsuario(result));
		}
		
		return result;
	}
	
	/**
	 * Devuelve el numero de mesa asignado a un usuario con rol de presidente de mesa, si el usuario es administrador o el nombre de usuario no existe el metodo devuelve null.
	 * @param nombreUsuario
	 * @return
	 */
	public Integer getNumeroMesaAsignadoPorNombreUsuarioPresidenteMesa (String nombreUsuario){
		Integer result = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT mesas_numero ");
			
			query.append("FROM mesas ");
		
			query.append("WHERE  mesas_presidente_mesa='").append(nombreUsuario).append("' ");			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			
			if(rs.first()){
				result = rs.getInt("mesas_numero");
			}
		} catch (NamingException e) {
			e.printStackTrace();
			result = null;
		} catch (SQLException e) {
			e.printStackTrace();
			result = null;
		} catch (Exception e) {
			e.printStackTrace();
			result = null;
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		
		return result;
	}
	
	public Boolean agregarUsuario(Usuario usuario){
		Boolean result = Boolean.FALSE;
		
		Connection con = null;
		Statement stmt = null;
		StringBuilder query = new StringBuilder("");
		
		PropiedadesSistemaConsultas propiedadesSistemaConsultas = new PropiedadesSistemaConsultas();
		String estadoVotacion = propiedadesSistemaConsultas.getEstadoVotacion();
		if(Constantes.ESTADO_VOTACION_PREPARACION.equals(estadoVotacion)){
		
			try {
				//creo la coneccion y la sentencia
				con = UtilidadesConexion.getConnectionFromTomcatPool();
				stmt = con.createStatement();
				
				query.append("INSERT INTO usuarios (usuarios_nombre_usuario, usuarios_nombres, usuarios_apellidos, usuarios_tipo_documento, usuarios_numero_documento, usuarios_contrasenia)");
				query.append("VALUES ( ")
					.append("'").append(usuario.getNombreUsuario()).append("', ")
					.append("'").append(usuario.getNombres()).append("', ")
					.append("'").append(usuario.getApellidos()).append("', ")
					.append(usuario.getDocumentoIdentidad().getId().toString()).append(", ")
					.append("'").append(usuario.getNumeroDocumento()).append("', ")
					.append("'").append(usuario.getContrasenia()).append("' )");
				
				//ejecuto el update
				stmt.executeUpdate(query.toString());
				
				result = Boolean.TRUE;
				
			} catch (NamingException e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			} catch (SQLException e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			} catch(Exception e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			}finally {
				
			    if (stmt != null) {
			      try { 
			    	  	stmt.close();
			    	  } catch (SQLException e) {
			    		  
			    	  }
			      stmt = null;
			    }
				if(con!=null){
					try {
						con.close();
					} catch (SQLException e) {
						
					}
					con = null;
				}
			}
		}
		return result;
	}
	
	public Boolean actualizarUsuario(Usuario usuario){

		Boolean result = Boolean.FALSE;
		
		Connection con = null;
		Statement stmt = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			stmt = con.createStatement();
			
			query.append("UPDATE usuarios ")
				.append("SET usuarios_nombres='").append(usuario.getNombres()).append("', ")
				.append("usuarios_apellidos='").append(usuario.getApellidos()).append("', ")
				.append("usuarios_tipo_documento=").append(usuario.getDocumentoIdentidad().getId().toString()).append(", ")
				.append("usuarios_numero_documento='").append(usuario.getNumeroDocumento()).append("', ")
				.append("usuarios_contrasenia='").append(usuario.getContrasenia()).append("' ");
				
			query.append("WHERE usuarios_nombre_usuario='").append(usuario.getNombreUsuario().toString()).append("' ");
			//ejecuto el update
			stmt.executeUpdate(query.toString());
			
			result = Boolean.TRUE;
			
		} catch (NamingException e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		} catch (SQLException e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		} catch(Exception e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		}finally {
			
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return result;
	}
	
	public Boolean eliminarUsuario(Usuario usuario){
		Boolean result = Boolean.FALSE;
		
		Connection con = null;
		Statement stmt = null;
		StringBuilder query = new StringBuilder("");
		
		PropiedadesSistemaConsultas propiedadesSistemaConsultas = new PropiedadesSistemaConsultas();
		String estadoVotacion = propiedadesSistemaConsultas.getEstadoVotacion();
		if(Constantes.ESTADO_VOTACION_PREPARACION.equals(estadoVotacion)){
		
			try {
				//no se puede borrar el administrador principal de la aplicacion
				if(usuario!=null && usuario.getNombreUsuario().length()>0 && !usuario.getNombreUsuario().equals("admin")){
					//creo la coneccion y la sentencia
					con = UtilidadesConexion.getConnectionFromTomcatPool();
					stmt = con.createStatement();
					
					query.append("DELETE FROM usuarios ");
					query.append("WHERE usuarios_nombre_usuario='").append(usuario.getNombreUsuario().toString()).append("' ");
					//ejecuto el update
					stmt.executeUpdate(query.toString());
					
					result = Boolean.TRUE;
				}
			} catch (NamingException e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			} catch (SQLException e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			} catch(Exception e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			}finally {
				
			    if (stmt != null) {
			      try { 
			    	  	stmt.close();
			    	  } catch (SQLException e) {
			    		  
			    	  }
			      stmt = null;
			    }
				if(con!=null){
					try {
						con.close();
					} catch (SQLException e) {
						
					}
					con = null;
				}
			}
		}
		return result;
	}
	
}
